3. UseEffect

useEffect is a React function used to run some code after the component renders, like fetching data or setting timers, and it helps control when that code runs, such as only once when the component loads or every time a value changes.

without dependency list useEffect runs on every render
with empty list it runs only once on first render
with values in the list it runs only when those values change

code for login and use effect to fetch data from api and print it

app.jsx

import { useEffect, useState } from 'react'
import './App.css'
import Client from './components/Client'

function App() {
  const [isloggedIn, setIsLoggedIn] = useState(false)
  // useEffect(()=>{
  //   alert("i run on every logged in change")
  // },[isloggedIn])
  const loginHandler = () => {
    setIsLoggedIn((!isloggedIn))
  }
  return (
    <>
      <h1>welcome</h1>
      <h2>{isloggedIn ? <Client/>:"first login in"}</h2>
      <button onClick={loginHandler}>{isloggedIn ? 'Logout':'Login'}</button>
    </>
  )
}
export default App

components/clients.jsx

import React, { useState,useEffect } from 'react'
const Client = () => {
    const [data,setdata]=useState([])
    const [loading,setloading]=useState(true)

    useEffect(()=>{
        fetch('https://jsonplaceholder.typicode.com/posts')
        .then(res=>res.json())
        .then(data=>setdata(data))
        .then(setloading(false))
    },[])
    
  return (
    <div>
        <h2>this is your data in the client</h2>

        {
            loading ? <h3>Loadinggggg</h3>
            :
            <div>
                <ul>
                    {data.map(post=>(
                        <li>{post.id}</li>
                    ))}
                </ul>
            </div>
        }        
    </div>
  )
}

export default Client

More

1. Passing props as children
2. State lifting
4. Context API